<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<script>
		var obj = {
			name: 'HXY',
			age: 23
		};
		Object.defineProperty(obj, 'age', {
			//  value="GML",
			//  configurable: true,
			//  enumerable: true,
			//  writable:true,

			get: function () {
				console.log('get方法被调用了');
				return '20';
				console.log(obj.name);
			},
			set: function (value) {
				console.log('set方法被调用了');
				this.age = '20'
				console.log(obj.age);
			}

		});
		for (key in obj) {
			console.log(key + ":" + obj[key]);
		}
		obj.name = "GML"
		// delete obj.name
		console.log(obj);
		/*
		参数:
		  obj: 要定义属性的对象
		  prop: 要定义或修改的属性的名称或Symbol
		  descriptor: 要定义或修改的属性描述符
		返回值:
		  被传递给函数的对象
		内容:
		configurable:
		  当且仅当该属性的configurable键值为true时, 该属性的描述符才能够被改变, 同时该属性也能从对应的对象上被删除,默认为false
		enumerable:
		  当且仅当该属性的enumerable键值为true时, 该属性才会出现在对象的枚举属性中,默认为false
		value:
		  该属性对应的值可以是任何有效的JavaScript值（数值，对象，函数等）,默认为undefined
		writable:
		  当且仅当该属性的writable键值为true时,属性的值,也就是上面的value,才能被赋值运算符改变,默认为false
		get:
		  属性的getter函数,如果没有getter,则为undefined,当访问该属性时，会调用此函数。执行时不传入任何参数，但是会传入 this 对象（由于继承关系，这里的this并不一定是定义该属性的对象）。该函数的返回值会被用作属性的值。默认为undefined。
		set:
		  属性的setter函数，如果没有setter，则为undefined。当属性值被修改时，会调用此函数。该方法接受一个参数（也就是被赋予的新值），会传入赋值时的 this 对象。默认为undefined
		*/
	</script>
</body>

</html>